//给定一个整数，编写一个算法将这个数转换为十六进制数。对于负整数，我们通常使用 补码运算 方法。 
//
// 注意: 
//
// 
// 十六进制中所有字母(a-f)都必须是小写。 
// 十六进制字符串中不能包含多余的前导零。如果要转化的数为0，那么以单个字符'0'来表示；对于其他情况，十六进制字符串中的第一个字符将不会是0字符。 
// 给定的数确保在32位有符号整数范围内。 
// 不能使用任何由库提供的将数字直接转换或格式化为十六进制的方法。 
// 
//
// 示例 1： 
//
// 
//输入:
//26
//
//输出:
//"1a"
// 
//
// 示例 2： 
//
// 
//输入:
//-1
//
//输出:
//"ffffffff"
// 
// Related Topics 位运算 数学 
// 👍 221 👎 0

package com.cute.leetcode.editor.cn;

import java.util.Deque;
import java.util.LinkedList;

public class ConvertANumberToHexadecimal {
    public static void main(String[] args) {
        Solution solution = new ConvertANumberToHexadecimal().new Solution();
    }
    //leetcode submit region begin(Prohibit modification and deletion)

    /**
     * 将一个数字转换为16进制
     * 不能使用库函数完成：return Integer.toString(num, 16);
     * 字母为小写，负数的话使用补码形式进行运算，即答案中不存在负号且不存在前导零
     * 无符号int使用无符号位操作进行取余和除法
     */
    class Solution {
        public String toHex(int num) {
            if (num == 0) return "0";
            char[] map = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
            StringBuilder s = new StringBuilder();
            while (num != 0){
                s.append(map[num&0b1111]);//低四位与1111相与，得到的是低四位的值，即取的余数
                num >>>= 4;//必须进行无符号右移，相当于/16了
            }

            return s.reverse().toString();//这里记得将s倒叙输出

        }
    }
//leetcode submit region end(Prohibit modification and deletion)

}